﻿#define _CRT_SECURE_NO_WARNINGS

#include "game.h"

//实现初始化棋盘函数：
void initboard(char board[Rows][Cols], int rows, int cols, char x)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = x;
		}
	}
}

//实现打印棋盘函数：
void printboard(char board[Rows][Cols], int row, int col)
{
	int i = 1;
	int j = 1;
	//打印棋盘标志，让棋盘更显眼
	printf("------ 扫雷 -------\n");
	//打印列号：
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	//列号打印完进行换行
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		//打印行号
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		//每打印完一行就要进行一次换行：
		printf("\n");
	}
	//打印棋盘标志，让棋盘更显眼
	printf("------ 扫雷 -------\n");
	//棋盘打印完之后进行换行
	printf("\n");
}

//实现布置雷函数：
void setboard(char board[Rows][Cols], int count)
{
	while (count)
	{
		int x = rand() % Row + 1;
		int y = rand() % Col + 1;
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//如果坐标不是雷，获取坐标周围雷的个数
int getcount(char hide[Rows][Cols], int x, int y)
{
	return (hide[x][y - 1] + hide[x][y + 1] +
		hide[x - 1][y] + hide[x - 1][y - 1] + hide[x - 1][y + 1] +
		hide[x + 1][y] + hide[x + 1][y - 1] + hide[x + 1][y + 1] - 8 * '0');
}

//如果坐标不是雷，并且坐标周围的八个坐标也不是雷，那么扩展坐标周围
//如果坐标周围至少有一个雷，那么直接将雷的个数显示出来
void exdboard(char show[Rows][Cols], char hide[Rows][Cols], int row,int col,int x, int y,int* ptr)
{
	int i = 0;
	int j = 0;
	int ret = getcount(hide, x, y);
	show[x][y] = ret + '0';
	(*ptr)++;
	if (show[x][y] == '0')
		show[x][y] = ' ';

	if (ret != 0)
		return ;
	else
	{
		for (i = -1; i <= 1; i++)
		{
			for (j = -1; j <= 1; j++)
			{
				if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col)
				{
					if (show[x + i][y + j] == '*')
					{
						exdboard(show, hide, row, col, x + i, y + j,ptr);
					}
				}
			}
		}
	}

	
}

//实现标记雷函数；
void markmine(char show[Rows][Cols])
{
	char arr[10];
	int x = 0;
	int y = 0;
	int i = 0;
	printf("是否标记雷：");
	scanf("%s",arr);
	if (strcmp(arr,"是")==0)
	{
		printf("请输入要标记的雷的坐标：");
		scanf("%d%*c%d", &x, &y);
		show[x][y] = 'X';
		printf("\n");
		printboard(show, Row, Col);
	}
	else
		return;
}

//实现排查雷函数：
void findboard(char show[Rows][Cols], char hide[Rows][Cols], int row, int col, int count)
{
	int x = 0;
	int y = 0;
	int win = 0;
	printf("请输入空格或英文逗号隔开坐标！\n\n");
	while (win < row * col - count)
	{
		printf("请输入要排查的坐标：");
		//这里需要用到之前学过的%*c，就是
		//scanf的赋值忽略符*
		//使用过后就可以输入空格或者英文逗号隔开坐标，但是不能用中文
		//这里中文和英文逗号不能都使用
		//所以我们最好在开始时给予一些提示
		scanf("%d%*c%d", &x, &y);
		printf("\n");
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (hide[x][y] == '1')
			{
				printf("很遗憾，你踩到雷了，游戏失败！\n\n");
				printf("显示的0代表不是雷，1表示雷\n\n");
				printboard(hide, Row, Col);
				break;
			}
			else
			{
				exdboard(show,hide,row,col,x,y,&win);
				printboard(show, Row, Col);
				//printboard(hide, Row, Col);

				//标记雷：
				markmine(show);
			}
		}
		else
		{
			printf("输入有误，请重新输入！\n");
		}
	}
	if (win == Row * Col - Count)
	{
		printf("恭喜你，扫雷成功！\n\n");
		printf("显示的0代表不是雷，1表示雷\n\n");
		printboard(hide, Row, Col);
	}
}

